home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / data / happysrc / picallsp.c < prev    next >
Text File  |  1993-11-30  |  26KB  |  848 lines

  1. /**********************************************************************
  2.  *
  3.  *       *** HAPPy P-code Interpriter ***
  4.  *
  5.  *          Standard procedure , function の処理
  6.  *
  7.  *        void callsp(void)
  8.  *        void T_get(int fileno, _store *filebuf, FILE *fp,char *name)
  9.  *
  10.  *            Copyright (c) H.Asano 1992.
  11.  **********************************************************************/
  12.  
  13. #define EXTERN extern
  14.  
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include <math.h>
  19. #include "hapai.h"
  20.  
  21. extern void prerr(int,char*) ;
  22.  
  23. /********* P-CODE COMPUTER store **********/
  24. extern _store store[] ;
  25.  
  26. /********* P-CODE COMPUTER registers **********/
  27.  
  28. extern int q   ;      /* q */
  29.  
  30. extern _store *sp ;  /* sp points to top of the stack */
  31.  
  32. extern int pc   ;     /* program counter */
  33. extern int mp   ;     /* mp points to begginning of a data segment */
  34. extern int ep   ;     /* ep points to the maxmum extent of the stack */
  35. extern int np   ;     /* np points to top of the dynamically allocated area */
  36.  
  37.  
  38. extern boolean readlnflag ;             /* inputにreadlnをした時 及び
  39.                                            起動時には真               */
  40.  
  41.  
  42. /**************************************************/
  43. /* searchfile() : fileadrに対応するファイルを探す *
  44. /**************************************************/
  45. static fileinfo *searchfile(int fileadr)
  46. {
  47.   int i = -1 ;
  48.  
  49.      while(fi[++i].fileadr != fileadr) ;
  50.      return(fi+i) ;
  51. }
  52.  
  53. /**************************************************/
  54. /* fileerrmsg() : file関係のエラーメッセージ出力  */
  55. /**************************************************/
  56. static void fileerrmsg(int msgno,char *pname,fileinfo *fiadr,char *msg)
  57. {
  58.   char *fname, *rfname;
  59.   char buf[160] ;
  60.  
  61.      fname =  (*fiadr).filename ;
  62.      rfname = (*fiadr).rfname   ;
  63.      sprintf(buf,"%s: %s(実ファイル=%s)%s", pname,fname,rfname,msg) ;
  64.      prerr(msgno,buf) ;
  65. }
  66.  
  67. /******************************************/
  68. /* checkgeneration() : 生成モードチェック */
  69. /******************************************/
  70. static void checkgeneration(char *pname,fileinfo *fiadr)
  71. {
  72.      if((*fiadr).mode != generation)
  73.       fileerrmsg(9,pname,fiadr,"が生成モードでない") ;
  74. }
  75.  
  76. /******************************************/
  77. /* checkinspection() : 検査モードチェック */
  78. /******************************************/
  79. static void checkinspection(char *pname,fileinfo *fiadr)
  80. {
  81.      if((*fiadr).mode != inspection)
  82.       fileerrmsg(14,pname,fiadr,"が検査モードでない") ;
  83. }
  84.  
  85. /*************************************************/
  86. /* err131() : ファイル書き込み障害メッセージ出力 */
  87. /*************************************************/
  88. static void err131(char *pname,fileinfo *fiadr)
  89. {
  90.       fileerrmsg(131,pname,fiadr,"で障害が発生した") ;
  91. }
  92.  
  93. /*****************************************/
  94. /* T_get() : textファイルからの1文字読込 */
  95. /*****************************************/
  96. void T_get(fileinfo *fiadr, _store *filebuf, FILE *fp,char *name)
  97. {
  98.      if(feof((*fiadr).fp))
  99.       fileerrmsg(42,name,fiadr,"がEOFとなっている") ;
  100.  
  101.      (*filebuf).vc = getc(fp) ;         /* 1文字先読み                */
  102.  
  103.      if(ferror(fp))
  104.       fileerrmsg(181,name,fiadr,"で障害が発生した") ;
  105.  
  106.      (*fiadr).eolnflag = (*filebuf).vc == '\n' ;
  107.                                         /* 改行を読んだ時 真          */
  108.      if((*fiadr).eolnflag) (*filebuf).vc = ' ' ;
  109. }
  110.  
  111. /******************* 各P-codeの処理 ***********************************/
  112.  
  113. /**************************************/
  114. /* ATN() : arctan標準関数             */
  115. /**************************************/
  116. static void ATN(void)
  117. {
  118.      (*sp).vr = (float)atan((double)(*sp).vr);
  119. }
  120.  
  121. /**************************************/
  122. /* COS() : cos標準関数                */
  123. /**************************************/
  124. static void COS(void)
  125. {
  126.      (*sp).vr = (float)cos((double)(*sp).vr) ;
  127. }
  128.  
  129. /**************************************/
  130. /* DIS() : dispose標準手続き          */
  131. /**************************************/
  132. static void DIS(void)
  133. {
  134.   int ad ;
  135.  
  136.      ad = (*(sp-1)).va ;                /* 解放するアドレス           */
  137.      if(ad == NilValue)
  138.       prerr(23,"dispose: 引数の値がnilである") ;
  139.      if((np <= ad) && (ad < Maxstore)) {            /* 正常値         */
  140.       if(ad == np) np += (short)(*sp).vi ;    /* 一番後にnewした時だけ*/
  141.                                               /* 本当に解放する       */
  142.      }
  143.      else prerr(24,"dispose: 引数の値が不定である") ;
  144.      sp-=2 ;
  145. }
  146.  
  147. /***************************************/
  148. /* EOL() : eol標準関数                 */
  149. /***************************************/
  150. static void EOL(void)
  151. {
  152.   fileinfo *fiadr ;
  153.  
  154.      fiadr  = searchfile((*sp).va) ;
  155.  
  156.      if((*fiadr).mode == undefined)
  157.       fileerrmsg(41,"eoln",fiadr,"が不定である") ;
  158.  
  159.      if(feof((*fiadr).fp))
  160.       fileerrmsg(42,"eoln",fiadr,"がEOFとなっている") ;
  161.  
  162.      if((fiadr==fi) && readlnflag) {    /* inputファイルで直前がreadln*/
  163.       T_get(fiadr,store+(*sp).va,(*fiadr).fp,"eoln") ;
  164.                                         /* 次の文字を読込             */
  165.       readlnflag = false ;
  166.      }
  167.      (*sp).vb = (*fiadr).eolnflag ;
  168. }
  169.  
  170. /***************************************/
  171. /* EoF() : eof標準関数                 */
  172. /***************************************/
  173. static void EoF(void)
  174. {
  175.   int fileadr ;
  176.   fileinfo *fiadr ;
  177.  
  178.      fileadr = (*sp).va ;
  179.      fiadr   = searchfile(fileadr) ;
  180.      if((fiadr==fi) && readlnflag) {    /* inputファイルで直前がreadln*/
  181.       T_get(fiadr,store+fileadr,(*fiadr).fp,"eof") ;
  182.                                         /* 次の文字を読込             */
  183.       readlnflag = false ;
  184.       (*sp).vb = feof((*fiadr).fp) ;
  185.      }
  186.      else {                             /* 通常のeof                  */
  187.       if((*fiadr).mode == undefined)
  188.        fileerrmsg(40,"eof",fiadr,"が不定である") ;
  189.  
  190.       (*sp).vb = ((*fiadr).mode == generation) /* 生成モードは真*/
  191.                      ?  true : feof((*fiadr).fp) ;
  192.      }
  193. }
  194.  
  195. /**************************************/
  196. /* EXP() : exp標準関数                */
  197. /**************************************/
  198. static void EXP(void)
  199. {
  200.      (*sp).vr = (float)exp((double)(*sp).vr) ;
  201. }
  202.  
  203. /**************************************/
  204. /* GET() : テキストファイル以外のget  */
  205. /**************************************/
  206. static void GET(void)
  207. {
  208.   int fileadr ;
  209.   fileinfo *fiadr ;
  210.   FILE *fp    ;
  211.  
  212.      fileadr = (*sp--).va ;
  213.      fiadr   = searchfile(fileadr) ;
  214.      fp      = (*fiadr).fp ;
  215.  
  216.      checkinspection("get",fiadr) ;
  217.  
  218.      if(feof(fp))
  219.       fileerrmsg(16,"get",fiadr,"がEOFとなっている") ;
  220.  
  221.      fread(store+fileadr, (*fiadr).filesize*sizeof(_store),1,fp);
  222.  
  223.      if(ferror(fp)) err131("get",fiadr) ;
  224. }
  225.  
  226. /**************************************/
  227. /* LOG() : ln標準関数                 */
  228. /**************************************/
  229. static void LOG(void)
  230. {
  231.      if((*sp).vr <= (float)0.0)
  232.       prerr(33,"ln: 引数の値が0以下である") ;
  233.      (*sp).vr = (float)log((double)(*sp).vr);
  234. }
  235.  
  236. /**************************************/
  237. /* NEW() : new標準手続き              */
  238. /**************************************/
  239. static void NEW(void)
  240. {
  241.   int ad ;
  242.  
  243.      ad = np-(short)(*sp).vi ;
  244.      if(ad <= ep)
  245.        prerr(121,"new: メモリ不足で割り付けができない") ;
  246.      np = ad ;
  247.      ad = (*(sp-1)).va ;
  248.      store[ad].va = np ;
  249.      sp-=2 ;
  250. }
  251.  
  252. /**************************************/
  253. /* PGE() : page標準手続き             */
  254. /**************************************/
  255. static void PGE(void)
  256. {
  257.   fileinfo *fiadr ;
  258.  
  259.      fiadr = searchfile((*sp--).va) ;
  260.      checkgeneration("page",fiadr) ;
  261.  
  262.      if(!(*fiadr).writelnflag)        /* 最後が改行でない時         */
  263.       if(fputc('\n',(*fiadr).fp) == EOF) err131("page",fiadr) ;
  264.      if(fputc('\f',(*fiadr).fp) == EOF)  err131("page",fiadr) ;
  265.      (*fiadr).writelnflag = false ;
  266. }
  267.  
  268. /**************************************/
  269. /* PUT() : テキストファイル以外のput  */
  270. /**************************************/
  271. static void PUT(void)
  272. {
  273.   int  fileadr ;
  274.   fileinfo *fiadr ;
  275.   FILE *fp     ;
  276.  
  277.      fileadr = (*sp--).va ;
  278.      fiadr   = searchfile(fileadr) ;
  279.      fp      = (*fiadr).fp  ;
  280.  
  281.      checkgeneration("put",fiadr) ;
  282.  
  283.      fwrite(store+fileadr, (*fiadr).filesize*sizeof(_store),1,fp) ;
  284.  
  285.      if(ferror(fp))
  286.       fileerrmsg(182,"put",fiadr,"で障害が発生した") ;
  287. }
  288.  
  289. /**************************************/
  290. /* RLN() : テキストファイルのreadln   */
  291. /**************************************/
  292. static void RLN(void)
  293. {
  294.   FILE   *fp      ;
  295.   _store *filebuf ;
  296.   fileinfo *fiadr ;
  297.  
  298.      fiadr   = searchfile((*sp).va) ;
  299.      fp      = (*fiadr).fp            ;
  300.      filebuf = (*fiadr).filebuf       ;
  301.  
  302.      checkinspection("read",fiadr) ;
  303.  
  304.      if((fiadr==fi) && readlnflag)
  305.       T_get(fiadr,filebuf,fp,"readln");
  306.  
  307.      while(!(*fiadr).eolnflag)
  308.       T_get(fiadr,filebuf,fp,"readln");  /* 改行文字を読み飛ばす     */
  309.      if(fiadr == fi) readlnflag = true ; /* inputファイルの時        */
  310.      else
  311.       T_get(fiadr,filebuf,fp,"readln") ; /* 次の文字を読込           */
  312.  
  313.      sp-- ;
  314. }
  315.  
  316. /*****************************************/
  317. /* RDC() : テキストファイルからの文字読込*/
  318. /*****************************************/
  319. static void RDC(void)
  320. {
  321.   FILE   *fp      ;
  322.   _store *filebuf ;
  323.   fileinfo *fiadr ;
  324.   short ad ;
  325.  
  326.      fiadr   = searchfile((*sp).va) ;
  327.      fp      = (*fiadr).fp            ;
  328.      filebuf = (*fiadr).filebuf       ;
  329.  
  330.      checkinspection("read",fiadr) ;
  331.  
  332.      if(feof(fp))
  333.       fileerrmsg(16,"read",fiadr,"がEOFとなっている") ;
  334.  
  335.      if((fiadr==fi) && readlnflag) {   /* inputファイルで直前がreadln*/
  336.       T_get(fiadr,filebuf,fp,"read") ; /* 次の文字を読込             */
  337.       readlnflag = false ;
  338.      }
  339.  
  340.      ad = (*(sp-1)).va ;
  341.      store[ad].vc = (*filebuf).vc  ;    /* バッファ変数から変数へ代入 */
  342.  
  343.      T_get(fiadr,filebuf,fp,"read") ;  /* 次の文字を読込             */
  344.  
  345.      sp-=2               ;
  346. }
  347.  
  348. /*****************************************/
  349. /* RDI() : テキストファイルからの整数読込*/
  350. /*****************************************/
  351. static void RDI(void)
  352. {
  353.   FILE   *fp      ;
  354.   _store *filebuf ;
  355.   fileinfo *fiadr ;
  356.   int  ad  ;
  357.   int  lch ;
  358.   integer  ival = 0 ;
  359.   int sign = 1 ;
  360.  
  361.      fiadr   = searchfile((*sp).va) ;
  362.      fp      = (*fiadr).fp            ;
  363.      filebuf = (*fiadr).filebuf       ;
  364.      ad = (*(sp-1)).va;
  365.  
  366.      checkinspection("read",fiadr) ;
  367.  
  368.      if((fiadr==fi) && readlnflag) {   /* inputファイルで直前がreadln*/
  369.       T_get(fiadr,filebuf,fp,"read") ; /* 次の文字を読込             */
  370.       readlnflag = false ;
  371.      }
  372.  
  373.      while((*filebuf).vc == ' ')        /* 空白読み飛ばし             */
  374.       T_get(fiadr,filebuf,fp,"read");
  375.      if(((*filebuf).vc=='+') || ((*filebuf).vc=='-')) { /* 符号の時   */
  376.       sign = ((*filebuf).vc=='+') ? 1 : -1  ; /* 符号に応じた正負     */
  377.       T_get(fiadr,filebuf,fp,"read");
  378.      }
  379.  
  380.      if(((*filebuf).vc >= '0') && ((*filebuf).vc <= '9')) { /* 数字   */
  381.       do {
  382.        lch = (*filebuf).vc - '0' ;
  383.        if(ival <= (Maxint-lch/10))      /* 上限チェック               */
  384.         ival = ival*10 + lch ;
  385.        else
  386.         fileerrmsg(54,"read",fiadr,
  387.                    "から符号付き整数の形式でないものを読もうとした") ;
  388.        T_get(fiadr,filebuf,fp,"read");
  389.        if(feof(fp)) break ;             /* eofだったら終わり          */
  390.       } while(('0' <= (*filebuf).vc ) && ((*filebuf).vc <= '9')) ;
  391.  
  392.       store[ad].vi = sign * ival ;
  393.      }
  394.      else {                             /* 最初に数字がこなかった時   */
  395.       if(feof(fp)) fileerrmsg(16,"read",fiadr,"がEOFとなっている") ;
  396.       fileerrmsg(54,"read",fiadr,
  397.                  "から符号付き整数の形式でないものを読もうとした") ;
  398.      }
  399.  
  400.      sp-=2;
  401. }
  402.  
  403. /*****************************************/
  404. /* RDR() : テキストファイルからの実数読込*/
  405. /*****************************************/
  406. static void RDR(void)
  407. {
  408.   FILE   *fp      ;
  409.   _store *filebuf ;
  410.   fileinfo *fiadr ;
  411.   char buf[80] ;
  412.   char *stopstring ;
  413.   int  i       ;
  414.   integer ival = 0 ;                    /* 整数部の値                 */
  415.  
  416.      fiadr   = searchfile((*sp).va) ;
  417.      fp      = (*fiadr).fp            ;
  418.      filebuf = (*fiadr).filebuf       ;
  419.  
  420.      checkinspection("read",fiadr) ;
  421.  
  422.      if((fiadr==fi) && readlnflag) {   /* inputファイルで直前がreadln*/
  423.       T_get(fiadr,filebuf,fp,"read") ; /* 次の文字を読込             */
  424.       readlnflag = false ;
  425.      }
  426.  
  427.      for(i=0;i<80;i++) *(buf+i) = '\0'; /* バッファクリア             */
  428.      i = 0 ;
  429.  
  430.      while((*filebuf).vc == ' ')        /* 空白読み飛ばし             */
  431.       T_get(fiadr,filebuf,fp,"read");
  432.      if(((*filebuf).vc=='+') || ((*filebuf).vc=='-')) { /* 符号の時   */
  433.       buf[i++] = (char)(*filebuf).vc ;
  434.       T_get(fiadr,filebuf,fp,"read");
  435.      }
  436.  
  437.      if(((*filebuf).vc >= '0') && ((*filebuf).vc <= '9')) { /* 数字   */
  438.       do {
  439.        buf[i++] = (char)(*filebuf).vc ;
  440.        ival = ival*10 + (*filebuf).vc - '0';
  441.        T_get(fiadr,filebuf,fp,"read");
  442.        if(feof(fp)) break ;             /* eofだったら終わり          */
  443.       } while(('0' <= (*filebuf).vc ) && ((*filebuf).vc <= '9')) ;
  444.  
  445.       if((*filebuf).vc == '.') {         /* 小数点                     */
  446.        buf[i++] = (char)(*filebuf).vc ;
  447.        T_get(fiadr,filebuf,fp,"read");  /* 小数点を読み飛ばす         */
  448.        if(((*filebuf).vc >= '0') && ((*filebuf).vc <= '9')) { /* 数字  */
  449.         do {
  450.          buf[i++] = (char)(*filebuf).vc ;
  451.          T_get(fiadr,filebuf,fp,"read");
  452.          if(feof(fp)) break ;           /* eofだったら終わり          */
  453.         } while(('0' <= (*filebuf).vc ) && ((*filebuf).vc <= '9')) ;
  454.        }
  455.        else goto error ;                /* . の次が数字でない時       */
  456.       }
  457.  
  458.       if(((*filebuf).vc == 'e') || ((*filebuf).vc == 'E')) { /* 指数*/
  459.        buf[i++] = (char)(*filebuf).vc ;
  460.        T_get(fiadr,filebuf,fp,"read");  /* eまたはEを読み飛ばす    */
  461.        if(((*filebuf).vc=='+') || ((*filebuf).vc=='-')) { /* 符号の時*/
  462.         buf[i++] = (char)(*filebuf).vc ;
  463.         T_get(fiadr,filebuf,fp,"read");
  464.        }
  465.        if(((*filebuf).vc >= '0') && ((*filebuf).vc <= '9')) { /* 数字*/
  466.         do {
  467.          buf[i++] = (char)(*filebuf).vc ;
  468.          T_get(fiadr,filebuf,fp,"read");
  469.          if(feof(fp)) break ;           /* eofだったら終わり          */
  470.         } while(('0' <= (*filebuf).vc ) && ((*filebuf).vc <= '9')) ;
  471.        }
  472.        else goto error ;                /* 指数部の最初が数字でない   */
  473.       }
  474.      }
  475.      else goto error ;                  /* 最初に数字がこなかった時   */
  476.  
  477.      store[(*(sp-1)).va].vr = (float)strtod(buf,&stopstring) ;
  478.  
  479.      sp -= 2;
  480.      return ;
  481.  
  482.  error :                                /* 符号つき数字でない時       */
  483.      if(feof(fp)) fileerrmsg(16,"read",fiadr,"がEOFとなっている") ;
  484.      fileerrmsg(56,"read",fiadr,
  485.                 "から符号付き数の形式でないものを読もうとした") ;
  486. }
  487.  
  488. /****************************************/
  489. /* RST() : テキストファイル以外のreset  */
  490. /****************************************/
  491. static void RST(void)
  492. {
  493.    int  fileadr ;
  494.    fileinfo *fiadr ;
  495.    FILE *fp     ;
  496.  
  497.      fileadr = (*sp--).va ;
  498.      fiadr   = searchfile(fileadr) ;
  499.  
  500.      fclose((*fiadr).fp) ;            /*まずクローズ(エラーでも良い)*/
  501.      fp = fopen((*fiadr).rfname,"rb") ;
  502.      if(fp == NULL)
  503.       fileerrmsg(13,"reset",fiadr,"が不定である") ;
  504.  
  505.      (*fiadr).mode = inspection ;     /* 検査モード                 */
  506.      (*fiadr).fp   = fp ;
  507.      fread(store+fileadr, (*fiadr).filesize*sizeof(_store),1,fp) ;
  508.                                         /* 最初の要素をバッファ変数に */
  509. }
  510.  
  511. /******************************************/
  512. /* RWT() : テキストファイル以外のrewrite  */
  513. /******************************************/
  514. static void RWT(void)
  515. {
  516.   fileinfo *fiadr ;
  517.  
  518.      fiadr  = searchfile((*sp--).va) ;
  519.  
  520.      fclose((*fiadr).fp) ;            /*まずクローズ(エラーでも良い)*/
  521.      (*fiadr).fp = fopen((*fiadr).rfname,"wb") ;
  522.      if((*fiadr).fp == NULL)
  523.       fileerrmsg(132,"rewrite",fiadr,"のオープンができない") ;
  524.  
  525.      (*fiadr).mode = generation ;     /* 生成モード                 */
  526. }
  527.  
  528. /***************************************/
  529. /* SIN() : sin標準関数                 */
  530. /***************************************/
  531. static void SIN(void)
  532. {
  533.      (*sp).vr = (float)sin((double)(*sp).vr) ;
  534. }
  535.  
  536. /***************************************/
  537. /* SQT() : sqrt標準関数                */
  538. /***************************************/
  539. static void SQT(void)
  540. {
  541.      if((*sp).vr < (float)0.0)      /* 負の平方根                 */
  542.       prerr(34,"sqrt:引数の値が負である") ;
  543.      (*sp).vr = (float)sqrt((double)(*sp).vr);
  544. }
  545.  
  546. /***************************************/
  547. /* TGT() : テキストファイルのget       */
  548. /***************************************/
  549. static void TGT(void)
  550. {
  551.   FILE   *fp      ;
  552.   _store *filebuf ;
  553.   fileinfo *fiadr ;
  554.  
  555.      fiadr   = searchfile((*sp).va) ;
  556.      fp      = (*fiadr).fp            ;
  557.      filebuf = (*fiadr).filebuf       ;
  558.  
  559.      checkinspection("get",fiadr) ;
  560.  
  561.      if((fiadr==fi) && readlnflag) {   /* inputファイルで直前がreadln*/
  562.       T_get(fiadr,filebuf,fp,"get") ;  /* 次の文字を読込             */
  563.       readlnflag = false ;
  564.      }
  565.  
  566.      if(feof(fp))
  567.       fileerrmsg(16,"get",fiadr,"がEOFとなっている") ;
  568.  
  569.      T_get(fiadr,filebuf,fp,"get") ;   /* 次の文字を読込             */
  570.  
  571.      sp-- ;
  572. }
  573.  
  574. /***************************************/
  575. /* TPT() : テキストファイルへのput     */
  576. /***************************************/
  577. static void TPT(void)
  578. {
  579.   FILE *fp    ;
  580.   fileinfo *fiadr ;
  581.  
  582.      fiadr   = searchfile((*sp).va) ;
  583.      fp      = (*fiadr).fp            ;
  584.      checkgeneration("put",fiadr) ;
  585.  
  586.      if(fputc((*(store+(*sp--).va)).vc,fp) == EOF)   /* 文字出力  */
  587.       err131("put",fiadr) ;
  588.      (*fiadr).writelnflag = false ;
  589. }
  590.  
  591. /***************************************/
  592. /* TRS() : テキストファイルへのreset   */
  593. /***************************************/
  594. static void TRS(void)
  595. {
  596.   FILE *fp ;
  597.   fileinfo *fiadr ;
  598.   _store *filebuf ;
  599.  
  600.      fiadr   = searchfile((*sp--).va) ;
  601.      filebuf = (*fiadr).filebuf         ;
  602.  
  603.      if((strcmp((*fiadr).filename,"input")==0) || /* inputファイル  */
  604.         (strcmp((*fiadr).filename,"output")==0))  /* outputファイル */
  605.       fileerrmsg(81,"reset",fiadr,"に対してresetはできない") ;
  606.  
  607.      if((*fiadr).mode == generation)  /* 今が生成モードの時         */
  608.       if(! (*fiadr).writelnflag)      /* 最後が改行マークでない時   */
  609.        if(fputc('\n',(*fiadr).fp) == EOF)  /* 改行を書き込む        */
  610.         err131("reset",fiadr) ;
  611.      fclose((*fiadr).fp) ;            /* ファイルクローズ           */
  612.      fp = fopen((*fiadr).rfname,"rt") ; /* テキストモードオープン   */
  613.      if(fp == NULL)
  614.       fileerrmsg(13,"reset",fiadr,"が不定である") ;
  615.      (*fiadr).fp   = fp ;
  616.      (*fiadr).mode = inspection ;     /* 検査モード                 */
  617.      (*fiadr).textfile = true   ;     /* テキストファイル           */
  618.  
  619.      T_get(fiadr,filebuf,fp,"reset") ; /* 最初の文字を読む           */
  620. }
  621.  
  622. /***************************************/
  623. /* TRW() : テキストファイルへのrewrite */
  624. /***************************************/
  625. static void TRW(void)
  626. {
  627.   fileinfo *fiadr ;
  628.  
  629.      fiadr  = searchfile((*sp--).va) ;
  630.  
  631.      if((strcmp((*fiadr).filename,"input")==0) || /* inputファイル  */
  632.         (strcmp((*fiadr).filename,"output")==0))  /* outputファイル */
  633.       fileerrmsg(82,"rewrite",fiadr,"に対してrewriteはできない") ;
  634.  
  635.      fclose((*fiadr).fp) ;            /*まずクローズ(エラーでも良い)*/
  636.      (*fiadr).fp = fopen((*fiadr).rfname,"wt") ;
  637.      if((*fiadr).fp == NULL)
  638.       fileerrmsg(132,"rewrite",fiadr,"のオープンができない") ;
  639.  
  640.      (*fiadr).mode = generation ;     /* 生成モード                 */
  641.      (*fiadr).textfile = true   ;     /* テキストファイル           */
  642.      (*fiadr).writelnflag = true;     /* rewrite直後には改行いらない*/
  643. }
  644.  
  645. /***************************************/
  646. /* WLN() : writeln標準手続き           */
  647. /***************************************/
  648. static void WLN(void)
  649. {
  650.   fileinfo *fiadr ;
  651.  
  652.      fiadr = searchfile((*sp--).va) ;
  653.      checkgeneration("writeln",fiadr) ;
  654.      if(fputc('\n',(*fiadr).fp) == EOF) err131("writeln",fiadr) ;
  655.      (*fiadr).writelnflag = true ;
  656. }
  657.  
  658. /***************************************/
  659. /* WRB() : boolean型の出力             */
  660. /***************************************/
  661. static void WRB(void)
  662. {
  663.   fileinfo *fiadr ;
  664.   char *put ;
  665.   short i,j,k ;
  666.   FILE *fp  ;
  667.  
  668.      fiadr = searchfile((*sp).va) ;
  669.      fp = (*fiadr).fp ;
  670.  
  671.      checkgeneration("write",fiadr) ;
  672.  
  673.      put = ((*(sp-2)).vb) ?  "TRUE" : "FALSE" ;
  674.      j   = strlen(put) ;                /* 出力文字長                 */
  675.      k = (short)(*(sp-1)).vi ;          /* 出力幅                     */
  676.  
  677.      if(k>j)                            /* 空白をつける必要のある時   */
  678.       for(i=1;i<=(k-j);i++)
  679.        if(fputc(' ',fp) == EOF) err131("write",fiadr) ;
  680.      else j= k ;
  681.      for(i=0;i<j;i++)
  682.       if(fputc((int)put[i], fp) == EOF) err131("write",fiadr) ;
  683.  
  684.      (*fiadr).writelnflag = false ;
  685.  
  686.      sp-=3;
  687. }
  688.  
  689. /***************************************/
  690. /* WRC() : テキストファイルに文字出力  */
  691. /***************************************/
  692. static void WRC(void)
  693. {
  694.   fileinfo *fiadr ;
  695.   int i ;
  696.   FILE *fp  ;
  697.  
  698.      fiadr = searchfile((*sp).va) ;
  699.      fp = (*fiadr).fp ;
  700.  
  701.      checkgeneration("write",fiadr) ;
  702.  
  703.      for(i=1;i<(int)(*(sp-1)).vi;i++)
  704.       if(fputc(' ',fp) == EOF) err131("write",fiadr) ;
  705.      if(fputc((*(sp-2)).vc,fp) == EOF) err131("write",fiadr) ;
  706.  
  707.      (*fiadr).writelnflag = false ;
  708.  
  709.      sp-=3 ;
  710. }
  711.  
  712. /***************************************/
  713. /* WRF() : テキストファイルに実数出力  */
  714. /***************************************/
  715. static void WRF(void)
  716. {
  717.   fileinfo *fiadr ;
  718.   FILE *fp  ;
  719.   char buf1[80] ;
  720.   char buf2[80] ;
  721.   int width ;
  722.   int i ;
  723.  
  724.      fiadr = searchfile((*sp).va) ;
  725.      fp = (*fiadr).fp ;
  726.  
  727.      checkgeneration("write",fiadr) ;
  728.  
  729.      *buf1 = '%' ;                      /*  %1.xfという形を生成       */
  730.      sprintf(buf1+1,"1.%df",(int)(*(sp-1)).vi) ;   /* 少数点以下の桁数*/
  731.      width = sprintf(buf2,buf1,(*(sp-3)).vr);      /* 固定小数点変換  */
  732.      for(i=width;i<(int)(*(sp-2)).vi;i++)
  733.       if(fputc(' ',fp) == EOF)          /* 前に空白を出力する         */
  734.        err131("write",fiadr) ;
  735.      if(fputs(buf2,fp) != 0) err131("write",fiadr) ;
  736.  
  737.      (*fiadr).writelnflag = false ;
  738.  
  739.      sp-=4 ;
  740. }
  741.  
  742. /***************************************/
  743. /* WRI() : テキストファイルに整数出力  */
  744. /***************************************/
  745. static void WRI(void)
  746. {
  747.   char buf[12];
  748.   fileinfo *fiadr ;
  749.   FILE *fp  ;
  750.   short i,len ;
  751.  
  752.      fiadr = searchfile((*sp).va) ;
  753.      fp = (*fiadr).fp ;
  754.  
  755.      checkgeneration("write",fiadr) ;
  756.  
  757.       len=sprintf(buf,"%ld",(*(sp-2)).vi); /* 数字出力に必要な桁      */
  758.       for(i=(short)(*(sp-1)).vi;i>len;i--)
  759.        if(fputc(' ',fp) == EOF)         /* 数字の前に空白を出力する   */
  760.         err131("write",fiadr) ;
  761.       if(fputs(buf,fp) != 0) err131("write",fiadr) ;
  762.  
  763.      (*fiadr).writelnflag = false ;
  764.  
  765.      sp -= 3 ;
  766. }
  767.  
  768. /***************************************/
  769. /* WRR() : テキストファイルに実数出力  */
  770. /***************************************/
  771. static void WRR(void)
  772. {
  773.   char buf[15] ;
  774.   int keta     ;
  775.   int width    ;
  776.   int point    ;
  777.   fileinfo *fiadr ;
  778.   FILE *fp  ;
  779.  
  780.      fiadr = searchfile((*sp).va) ;
  781.      fp = (*fiadr).fp ;
  782.  
  783.      checkgeneration("write",fiadr) ;
  784.  
  785.      keta  = (int)(*(sp-1)).vi    ;     /* 出力桁                     */
  786.      width = (keta >= 9) ? keta : 9 ;   /* 必要出力桁                 */
  787.      point = width - 8 ;
  788.      *buf = '%' ;                       /* %x.xEの形に変換            */
  789.      sprintf(buf+1,"%d.%dE",width,point);
  790.      fprintf(fp,buf,(*(sp-2)).vr) ;
  791.  
  792.      (*fiadr).writelnflag = false ;
  793.  
  794.      sp -= 3 ;
  795. }
  796.  
  797. /***************************************/
  798. /* WRS() : テキストファイルに文字列出力*/
  799. /***************************************/
  800. static void WRS(void)
  801. {
  802.   fileinfo *fiadr ;
  803.   FILE *fp  ;
  804.   short i,j,k ;
  805.   int ad    ;
  806.  
  807.      fiadr = searchfile((*sp).va) ;
  808.      fp = (*fiadr).fp ;
  809.  
  810.      checkgeneration("write",fiadr) ;
  811.  
  812.      ad=        (*(sp-3)).va ;
  813.      k = (short)(*(sp-2)).vi ;          /* k=出力幅                   */
  814.      j = (short)(*(sp-1)).vi ;          /* j=文字数                   */
  815.  
  816.      if(k>j)                            /* 空白をつける必要のある時   */
  817.       for(i=1;i<=(k-j);i++)
  818.        if(fputc(' ',fp) == EOF) err131("write",fiadr) ;
  819.      else j= k ;
  820.      for(i=0;i<j;i++)
  821.       if(fputc(store[ad+i].vc,fp) == EOF) err131("write",fiadr) ;
  822.  
  823.      (*fiadr).writelnflag = false ;
  824.  
  825.      sp-=4;
  826. }
  827.  
  828.  
  829. /**********************************************************************/
  830. /*                      P-code   別 処理エントリ表                    */
  831. /**********************************************************************/
  832.  
  833. static struct entry {
  834.        void (*func)(void) ;
  835. } pcd[] = {
  836.            /*         xx0  xx1  xx2  xx3  xx4  xx5  xx6  xx7  xx8  xx9   */
  837.  
  838.            /*00x*/    GET, PUT, RST, RLN, NEW, WLN, WRS, WRB, WRI, WRR,
  839.            /*01x*/    WRC, RDI, RDR, RDC, SIN, COS, EXP, LOG, SQT, ATN,
  840.            /*02x*/    PGE, EoF, EOL, DIS, WRF, RWT, TRS, TRW, TGT, TPT
  841.          };
  842.  
  843. /********* callsp() : csp 命令の実行 ***********/
  844. void callsp(void)
  845. {
  846.      pcd[q].func() ;                    /* opに対応した命令を実行     */
  847. }
  848.